package cn.xinfei.xdecision.common.service.enginex.util;

import cn.xinfei.xdecision.common.model.enginex.po.EngineNode;

/**
 * 节点标记，通过二进制标记
 * Created by maying on 2023/04/27.
 **/
public class NodeTag {
	//二进制标记常量
	public static final int CHAMPION_TAG = 0b0001; //冠军分支节点标记,1
	public static final int CHALLENGER_TAG = 0b0010; //挑战者节点标记,2

	// 判断是否有某一标记（可以通过按位与运算来判断）
	public static boolean hasTag(EngineNode node, int nodeTag) {
		return (node.getNodeTags() & nodeTag) != 0;
	}

	// 判断是否有所有指定的标记
	public static boolean hasAllTags(EngineNode node, int... tags) {
		for (int t : tags) {
			if ((node.getNodeTags() & t) == 0) {
				return false;
			}
		}
		return true;
	}

	// 添加标记（可以通过按位或运算来添加）
	public static void addTag(EngineNode node, int newTag) {
		node.setNodeTags(node.getNodeTags() | newTag);
	}

	// 删除某种标记（可以通过按位异或运算来删除）
	public static void removeTag(EngineNode node, int removeTag) {
		node.setNodeTags(node.getNodeTags() ^ removeTag);
	}
}
